package com.yeban.javase.day11.test03;

import java.util.*;

/**
 * @Desc TODO
 * @Author yeban
 * @Date 2025/10/21
 *
 * 1.定义Book类
 * 2.完成主界面和选择
 * 3.完成查询所有图书
 * 4.完成添加图书
 * 5.完成删除图书
 * 6.完成修改图书
 * 7.使用Debug追踪调试
 */

public class Bms {

    private static Map<String,Book> booksMap = new HashMap<>();    // 类型和书
    private static Scanner sc = new Scanner(System.in);

    public Bms() {
    }

    public static void main(String[] args) {

        initBooks();
        Bms bms = new Bms();

        while(true) {
            System.out.println("----------- 欢迎来到图书管理系统 ----------");
            System.out.println("1. 查看所有书籍");
            System.out.println("2. 添加书籍");
            System.out.println("3. 删除书籍");
            System.out.println("4. 修改书籍");
            System.out.println("5. 退出");
            System.out.println("请输入你的选择：");

            int n = sc.nextInt();
            sc.nextLine(); // 吃掉换行符
            switch (n) {
                case 1:
                    // 查看所有书籍
                    queryAllBooks();
                    break;
                case 2:
                    // 添加书籍
                    addBook();
                    break;
                case 3:
                    // 删除书籍
                    deleteBook();
                    break;
                case 4:
                    // 修改书籍
                    updateBook();
                    break;
                case 5:
                    // 退出
                    System.out.println("退出");
                    System.out.println("谢谢你的使用");
                    System.exit(0);
                    break;
                default:
                    System.out.println("输入错误，请重新输入");
                    break;
            }
        }
    }

    /**
     * 1. 初始化图书数据
     */
    private static void initBooks() {
        booksMap.put("西游记", new Book("名著", "西游记", 19.0));
        booksMap.put("水浒传", new Book("名著", "水浒传", 29.0));
        booksMap.put("Java入门到精通", new Book("IT书籍", "Java入门到精通", 99.0));
        booksMap.put("PHP入门到精通", new Book("IT书籍", "PHP入门到精通", 9.9));
    }

    /**
     * 2. 查看所有书籍
     */
    private static void queryAllBooks() {

        // 存放不同类的书籍
        Map<String, List<Book>> booksByType = new HashMap<>();

        // 遍历所有的键值对
        for(Map.Entry<String,Book> entry : booksMap.entrySet()) {
            Book book = entry.getValue();
            String type = book.getType(); // 获取当前书籍的类型

            if(!booksByType.containsKey(type)) {
                booksByType.put(type, new ArrayList<>());
            }
            // 将当前类型加入到对应类型的书的集合中
            booksByType.get(type).add(book);
        }

        // 输出
        // 打印键
        System.out.println("类型" + "\t\t书名" + "\t\t\t价格");
        for(Map.Entry<String, List<Book>> entry : booksByType.entrySet()) {
            String type = entry.getKey();
            List<Book> books = entry.getValue();
            // 打印类型
            System.out.println(type + "：");
            // 遍历打印当前类型的所有书
            for(Book book : books) {
                System.out.println("\t\t" + book.getName() + "\t\t" + book.getPrice());
            }
        }
    }

    /**
     * 3. 添加书籍
     */
    private static void addBook() {
        System.out.println("---------- 添加书籍 ----------");
        System.out.println("请输入要添加书籍的类型：");
        String bookType = sc.nextLine();
        System.out.println("请输入要添加的书名：");
        String bookName = sc.nextLine();
        System.out.println("请输入要添加的价格：");
        Double bookPrice = sc.nextDouble();

        // 判断该书是否存在
        if(booksMap.containsKey(bookName)) {    // 如果存在
            System.out.println("添加失败！");
            return;
        }

        // 如果没有则添加
        booksMap.put(bookName, new Book(bookType, bookName, bookPrice));
        System.out.println("添加" + bookName + "成功！");
    }

    /**
     * 4. 删除书籍
     */
    private static void deleteBook() {
        System.out.println("---------- 删除书籍 ----------");
        System.out.println("请输入要删除书籍的类型：");
        String bookType = sc.nextLine();
        System.out.println("请输入要删除的书名：");
        String bookName = sc.nextLine();

        // 判断删除的书籍是否存在
        Set<String> booksName = booksMap.keySet();
        if(!booksMap.containsKey(bookName)) {
            System.out.println("该书籍不存在！");
            return;
        }

        // 如果存在
        booksMap.remove(bookName);
        System.out.println("删除" + bookName + "书籍成功！");
    }

    /**
     * 5. 修改书籍
     */
    private static void updateBook() {
        System.out.println("---------- 修改书籍 ----------");
        System.out.println("请输入要修改书籍的类型：");
        String bookType = sc.nextLine();
        System.out.println("请输入要修改的书名：");
        String oldName = sc.nextLine();

        // 判断要修改的书籍是否存在
        if(!booksMap.containsKey(oldName)) {
            System.out.println("要修改的书籍不存在！");
            return;
        }

        System.out.println("请输入新的书名：");
        String newName = sc.nextLine();
        System.out.println("请输入新的价格：");
        Double newPrice = sc.nextDouble();

        // 如果书名变了
        if(!newName.equals(oldName)) {
            booksMap.remove(oldName);   // 删除原来书籍的键
        }

        booksMap.put(newName, new Book(bookType, newName, newPrice));
        System.out.println("修改成功！");
    }
}
